#!/usr/bin/env node

/**
 * 1、Node cli 入口需要添加上方的文件头
 * 2、梳理脚手架的工作流程：
 *      1>.通过命令行交互询问用户的需求信息（引入插件 inquirer，发起命令行询问）
 *      2>.根据用户的输入内容生成文件（创建模板文件存放目录 templates ）
 * 3、获取模板文件目录和目标写入目录
 *      1>.通过 path 模块拼接模板文件目录
 *      2>.通过 process.cwd 获取目标目录（即Node.js 进程的当前工作目录）
 * 4、将模板下的文件转换到目标路径下，也就是需要文件的读写操作，需要引入 fs 模块
 *      1>.通过 fs.readdir 读取模板下全部文件
 *      2>.遍历获取到的所有文件
 * 5、通过模板语法替换模板文件中的变量，引入 ejs 插件
 *      1>.通过 ejs.renderFile 渲染文件
*/

// 命令行交互询问
const inquirer = require("inquirer");
const path = require("path");
const fs = require("fs");
const ejs = require("ejs");

// 发起命令行询问，接收一个数组，配置用户的输入配置选项
// 该方法是一个 promise 对象，可再回调函数 then 中获取用户输入信息
inquirer.prompt([
    {
        // 交互类型
        type: "input",
        // 问题返回值的 key 值，用户获取用户输入
        name: "name",
        // 用户输入的提示信息
        message: "project name"
    }
]).then(answers => {
    // answers 即为用户的输入信息

    // 模板目录（__dirname为当前模块的目录名，此处即为 ../code/my-sample）
    const tmpDir = path.join(__dirname, "templates");
    // 目标路径
    const destDir = process.cwd();

    // 将模板下的文件全部转换到目标目录
    fs.readdir(tmpDir, (err, files) => {
        // node 回调，错误优先
        if (err) throw err;
        // 这里的 files 只是文件名称的数组，需要遍历和路径的拼接
        files.forEach(file => {
            console.log(file);
            // 通过模板引擎渲染文件
            /**
             * renderFile
             * 参数一：模板文件的绝对路径
             * 参数二：上下文对象
             * 参数三：回调函数
            */
            ejs.renderFile(path.join(tmpDir, file), answers, (err, result) => {
                if (err) throw err;
                // 将模板文件写入目标路径
                fs.writeFileSync(path.join(destDir, file), result);
            });
        })
    })
})